<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>

<body>
    <div id="app">
        <div id="hook-arguments-example" v-demo:foo.a.b="message"></div>
    </div>
    <script type="text/javascript" src="../../../../commonJS/vue.js"></script>
    <script type="text/javascript" src="../../../../commonJS/zepto-1.2.0.js"></script>
    <!-- <script type="text/javascript" src="../../../../commonJS/moment.js"></script> -->
    <!-- <script type="text/javascript" src="../../../../commonJS/common.js"></script> -->
    <script>
        // el：指令所绑定的元素，可以用来直接操作 DOM 。
        // binding：一个对象，包含以下属性：

        // name：指令名，不包括 v- 前缀。
        // value：指令的绑定值，例如：v-my-directive="1 + 1" 中，绑定值为 2。
        // oldValue：指令绑定的前一个值，仅在 update 和 componentUpdated 钩子中可用。无论值是否改变都可用。
        // expression：字符串形式的指令表达式。例如 v-my-directive="1 + 1" 中，表达式为 "1 + 1"。
        // arg：传给指令的参数，可选。例如 v-my-directive:foo 中，参数为 "foo"。
        // modifiers：一个包含修饰符的对象。例如：v-my-directive.foo.bar 中，修饰符对象为 { foo: true, bar: true }。
        // 【注意此处】修饰符多个，都是键值对的对象

        // vnode：Vue 编译生成的虚拟节点。移步 VNode API 来了解更多详情。
        // oldVnode：上一个虚拟节点，仅在 update 和 componentUpdated 钩子中可用。
        Vue.directive('demo', {
            bind: function(el, binding, vnode) {
                var s = JSON.stringify;
                el.innerHTML =
                    'name: ' + s(binding.name) + '<br>' +
                    // name: "demo"【指令名】
                    'value: ' + s(binding.value) + '<br>' +
                    // value: "pink"【指令绑定的值】
                    'expression: ' + s(binding.expression) + '<br>' +
                    // expression: "message"【指令绑定的值对应的表达式】
                    'argument: ' + s(binding.arg) + '<br>' +
                    // argument: "foo"
                    'modifiers: ' + s(binding.modifiers) + '<br>' +
                    // modifiers: {"a":true,"b":true}
                    'vnode keys: ' + Object.keys(vnode).join(', ')
                    // vnode keys: tag, data, children, text, elm, ns, context, fnContext, fnOptions, 
                    // fnScopeId, key, componentOptions, componentInstance, parent, raw, isStatic, 
                    // isRootInsert, isComment, isCloned, isOnce, asyncFactory, asyncMeta, isAsyncPlaceholder
            }
        })

        new Vue({
            el: '#hook-arguments-example',
            data: {
                message: 'pink'
            }
        })
    </script>
</body>